import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Graph {
    // 顶点数量
    private int apexNum;
    // 边的数量
    private int edgeNum;
    // 邻接表
    private List<LinkedList<Integer>> adj;
    /**
     * 创建一个包含V个顶点但不包含边的图
     * @param v
     */
    public Graph(int v) {
        this.adj = new ArrayList<>();
        // 初始化 list 里面的每一个 链表
        for (int i = 0; i < v; i++) {
            this.adj.add(new LinkedList<Integer>());
        }
    }

    /**
     * 获取顶点数量
     * @return
     */
    public int getApexNum() {
        return apexNum;
    }

    /**
     * 获取边的数量
     * @return
     */
    public int getEdge() {
        return edgeNum;
    }

    /**
     * 向图中添加一条边 v-w
     * @param v
     * @param w
     */
    public void addEdge(int v, int w) {
        if (v >= this.adj.size() || w > this.adj.size()) {
            return;
        }
        // 判断边存不存在（无向图值需要判断一次）
        for (int tmp : adj.get(v)) {
            if (tmp == w) {
                System.out.println("添加失败边已经存在");
                return;
            }
        }
        adj.get(v).add(w);
        adj.get(w).add(v);
        System.out.println("添加边成功");
        // 顶点数量加1
        apexNum++;
        // 边数+1
        edgeNum++;
        System.out.println(v+" ——> "+w);
        System.out.println(w+" ——> "+v);
    }

    /**
     * 获取和顶点 V 相邻的所有顶点
     * @param v
     * @return
     */
    public LinkedList<Integer> adj(int v) {
        if (v >= adj.size()) {
            System.out.println("该顶点不存在");
            return null;
        }

        return adj.get(v);
    }
}
